package com.itcam.advice;

/**
 * Author:Cammy.Wu
 * Date:2024-04-25
 * Description:定义四个增强方法，获取目标方法的信息 返回值以及异常对象
 */

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.junit.jupiter.api.Order;
import org.springframework.stereotype.Component;

import java.lang.reflect.Modifier;

/**
 * 1.定义方法 - 增强代码
 * 2.使用注解指定对应的位置
 * 3.配置切点表达式，选中方法
 * 4.切面和ioc的配置
 * 5.开启aspectj注解的支持
 * <p>
 * TODO:增强方法中获取目标方法信息
 *      1.全部增强方法中，获取目标方法的信息（方法名，参数，访问修饰符，所属的类的信息...）
 *      (JoinPoint joinPoint)   import org.aspectj.lang.JoinPoint;
 *      joinPoint包含目标方法的信息！
 *      2.返回的结果 - @AfterReturning
 *      (JoinPoint joinPoint,Object result) result接收返回结果
 *      @AfterReturning(value = "execution(* com..impl.*.*(..))",returning = "形参名即可")
 *      3.异常的信息 -  @AfterThrowing
 *      (JoinPoint joinPoint, Throwable throwable) throwable接收异常信息
 *      @AfterThrowing(value = "execution(* com..impl.*.*(..))", throwing = "形参名即可")
 */

//@Component
//@Aspect
public class CamAdvice {
    @Before("com.itcam.pointcut.MyPointCut.cpc()")
    public void before(JoinPoint joinPoint) {
        // 1.获取方法所属的类的信息
        String simpleName = joinPoint.getTarget().getClass().getSimpleName();
        // 2.获取方法名称
        String name = joinPoint.getSignature().getName();
        // 3.获取参数列表
        Object[] args = joinPoint.getArgs();
        // 4.获取对应的访问修饰符
        int modifiers = joinPoint.getSignature().getModifiers();
        String sm = Modifier.toString(modifiers);
    }

    @AfterReturning(value = "com.itcam.pointcut.MyPointCut.cpc()", returning = "result")
    public void afterReturning(JoinPoint joinPoint, Object result) {

    }

    @AfterThrowing(value = "com.itcam.pointcut.MyPointCut.cpc()", throwing = "throwable")
    public void afterThrowing(JoinPoint joinPoint, Throwable throwable) {

    }

    @After("com.itcam.pointcut.MyPointCut.cpc()")
    public void after() {

    }
}
